import serviceConfig from '../../config/index';
import errorCode from '../errorCode';
import router from "../../router/guard";
import axios from 'axios';
import store from '../../store';

// 默认登录的人 去登录【含过期】
const toLogin = () => {
	router.push({path: '/login'});
};

/**
 * 根据请求信息生成key
 * **/
const generateKey = (config) => {
	let {
		method, url, params, data
	} = config;
	return [method, url, JSON.stringify(data)].join("&");
};
/**
 * 添加请求信息
 * **/
const pendingRequest = new Map();
const addPendingRequest = (config) => {
	let requestKey = generateKey(config);
	config.cancelToken = config.cancelToken || new axios.CancelToken((cancel) => {
		if (!pendingRequest.has(requestKey)) {
			pendingRequest.set(requestKey, cancel)
		}
	})
};
/**
 * 取消重复请求
 * **/
const removePending = (config) => {
	let pendingKey = generateKey(config),
		cancelToken = pendingRequest.get(pendingKey);
	if (cancelToken) {
		cancelToken(pendingKey);
		pendingRequest.delete(pendingKey)
	}
};
export default () => {
	//1、创建 axios 的实例
	const instance = axios.create({
		baseURL: serviceConfig[process.env.NODE_ENV].serverURL,
		timeout: 60000
	});
	instance.defaults.headers['Content-Type'] = 'application/json;charset=utf8';
	//2、请求拦截器
	instance.interceptors.request.use(config => {
		/*
		//如果是post请求方式的会，需要对请求参数做处理，因为 axios 实际需要传的参数是 字符串 & 格式
		if(config.method === 'post'){
				return   config.data = qs.stringify(config.data)
		}
		*/
		//这里用可变传参的方式来，
		// Object.keys(config[1]).length > 0   &&  (configp[1] = qs.stringify(config[1]));
		//封装获取token令牌

		config.data = {
			token: store.state.token,
			data: config.data
		};

		removePending(config);
		addPendingRequest(config);

		return config
	}, err => {
	});

	//3、响应拦截器
	instance.interceptors.response.use(res => {
		//处理响应回来的数据，过滤掉 header 等网络信息，只获取后台 api 传回来的data 数据
		console.log(res);
		let getData = {...res.data};
		if (errorCode.get(getData.code)) {
			getData.code = 500;
			getData.msg = errorCode.get(getData.code).replace(/{msg}/, res.config.url);
		}

		if (res.data.code === 401) {
			toLogin();
		}

		return getData;
	}, error => {
		console.error(error.response);
		let getData = {
			code: 500,
			msg: errorCode.get(error.response.status).replace(/{msg}/, error.response.config.url) || '服务繁忙，请稍后再试'
		};

		if (error.response.status === 401) {
			toLogin();
		}

		return getData
	});

	//4、发送真正的网络请求
	return instance;
};
